﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script language="javascript" type="text/javascript" src="/Js/load.js?v=050E3FBC"></script>
    <title>TCP 接口服务框架 - C# 高性能自动化服务端框架 - 凹凸架构</title>
        <style type="text/css">
        a{text-decoration: none;}
        a:hover{text-decoration: underline;}
    </style>
</head>
<body>
    <p>
        高性能的 TCP 服务框架是 AutoCSer 的核心组件，支持若干<a href="/Config/Index.html?v=50E3FBC">全局默认配置</a>，需要引用 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Packet\*\AutoCSer.dll。
        <br />TCP 接口服务基于 Emit 动态生成代理类型，相对于使用<a href="/CodeGenerator.html?v=50E3FBC">静态代码生成</a>的 <a href="/TcpServer/MethodServer.html?v=50E3FBC">TCP 函数服务框架</a>上手简单，但功能支持相对简单，如果客户端与服务端共用同一个接口定义那么<b>同异步模式只能保持一致</b>。
        <br />框架根据应用场景分为<b>内部服务</b>与<b>开放服务</b>，两种服务的默认配置参数与防御攻击策略不同。
<br /><b>内部服务</b>默认配置：数据缓冲区 64KB，最大发送数据缓冲区 1MB，验证超时 4s，客户端失败重连时间 10ms，批量输出休眠等待时间 0ms，使用<a href="/Serialize/Binary.html?v=50E3FBC">二进制序列化</a>，服务端开启线程输出，客户端启动时创建连接，支持<a href="/TcpServer/Register.html?v=50E3FBC">服务注册</a>。
<br /><b>开放服务</b>默认配置：数据缓冲区 8KB，服务端最大发送数据缓冲区 8KB，验证超时 9s，客户端失败重连时间 1s，批量输出无等待时间，使用 <a href="/Serialize/Json.html?v=50E3FBC">JSON 序列化</a>，服务端同步输出，客户端在第一次访问时创建连接，客户端最大自定义数据包为 16KB
<br />注意：interface 接口定义必须使用 public 修饰，而且对于其它程序集可见。
    </p>
    <div><h1>内部服务</h1></div>
    <div>
        <p>
            . 同步函数支持 ref / out 参数。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode0" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','0');">TcpInterfaceServer\RefOut.cs</a></div>
        </p>
        <p>
            . 对于没有返回值且可靠性要求不高的需求，同步函数支持仅发送请求模式（无需服务端响应），返回值类型必须为 void，不支持 ref / out 参数。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode1" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','1');">TcpInterfaceServer\SendOnly.cs</a></div>
        </p>
        <p>
            . 支持异步回调，返回值类型必须为 void，不支持 ref / out 参数，最后一个参数类型必须是委托 <b>Func&lt;AutoCSer.Net.TcpServer.ReturnValue, bool&gt;</b> 或者 <b>Func&lt;AutoCSer.Net.TcpServer.ReturnValue&lt;returnType&gt;, bool&gt;</b>
            <br />服务端必须保证该回调委托被执行，该委托的返回值表示回调数据是否成功添加到发送队列中，失败可能意味着该连接已经关闭；对于客户端而言该返回值没有意义。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode2" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','2');">TcpInterfaceServer\Asynchronous.cs</a></div>
            <br />客户端与服务端采用不同的同异步模式需要<b>分别定义接口</b>，并通过配置 <b>CommandIdentityEnmuType</b> 建立映射关系，要求接口名称与枚举<b>名称一一对应</b>。
            <br /><b>注意</b>：服务端异步回调最后一个参数可以是抽象类型 <b>AutoCSer.Net.TcpServer.ServerCallbak</b> 或者 <b>AutoCSer.Net.TcpServer.ServerCallbak&lt;returnType&gt;</b>，该抽象类型<b>不能用于客户端</b>。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCodeb" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','b');">TcpInterfaceServer\ServerAsynchronous.cs</a></div>
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCodec" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','c');">TcpInterfaceServer\ClientAsynchronous.cs</a></div>
        </p>
        <p>
            . 客户端（<b>不支持服务端</b>）支持 await 异步模型，返回值参数类型必须为 <b>AutoCSer.Net.TcpServer.Awaiter</b> 或者 <b>AutoCSer.Net.TcpServer.Emit.Awaite&lt;returnType&gt;</b>。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCoded" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','d');">TcpInterfaceServer\ClientAwaiter.cs</a></div>
        </p>
        <p>
            . 支持异步回调注册，也就是说客户端一个请求，服务器端可以任意多次回调回应，服务端被动推送是典型的应用场景。
            <br />返回值类型必须为 <b>AutoCSer.Net.TcpServer.KeepCallback</b>，对于服务端而言该返回值没有意义。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode3" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','3');">TcpInterfaceServer\KeepCallback.cs</a></div>
        </p>
        <p>
            . 支持接口继承与显示接口实现
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode4" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','4');">TcpInterfaceServer\Inherit.cs</a></div>
        </p>
        <p>
            . 集成支持<a href="/TcpServer/RemoteExpression.html?v=50E3FBC">远程表达式链</a>
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode9" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','9');">TcpInterfaceServer\Expression.cs</a></div>
        </p>
        <p>
    . 简单序列化模式，采用<a href="/Serialize/Binary.html?v=50E3FBC">二进制序列化</a>模式时，输入输出参数类型如果全部属于以下类型，将默认开启简单序列化模式以提升序列化性能，否则将使用支持循环引用与成员选择的通用<a href="/Serialize/Binary.html?v=50E3FBC">二进制序列化</a>。
    <br /><b>bool</b>, <b>byte</b>, <b>sbyte</b>, <b>short</b>, <b>ushort</b>, <b>int</b>, <b>uint</b>, <b>long</b>, <b>ulong</b>, <b>float</b>, <b>double</b>, <b>decimal</b>, <b>char</b>, <b>DateTime</b>, <b>Guid</b>, <b>string</b>
    <br /><b>bool?</b>, <b>byte?</b>, <b>sbyte?</b>, <b>short?</b>, <b>ushort?</b>, <b>int?</b>, <b>uint?</b>, <b>long?</b>, <b>ulong?</b>, <b>float?</b>, <b>double?</b>, <b>decimal?</b>, <b>char?</b>, <b>DateTime?</b>, <b>Guid?</b>, <b>enum</b>
</p>
        <p>
            性能测试项目
            <br /><a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpInternalServerPerformance.Emit
            <br /><a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpInternalClientPerformance.Emit
            <br /><img @src="//f.autocser.com/TcpServer/InterfaceServer.png?v=2" alt="TCP 接口服务框架 内部服务 吞吐性能测试" />
            <br /><img @src="//f.autocser.com/TcpServer/InterfaceServer.Core.png" alt=".NET Core TCP 接口服务框架 内部服务 吞吐性能测试" />
            <br />从测试结果看来 .NET Core 的吞吐性能有较大提升。
        </p>
    </div>
    <div><h1>开放服务</h1></div>
    <div>
        <p>
            . 同步函数支持 ref / out 参数。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode5" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','5');">TcpInterfaceOpenServer\RefOut.cs</a></div>
        </p>
        <p>
            . 对于没有返回值且可靠性要求不高的需求，同步函数支持仅发送请求模式（无需服务端响应），返回值类型必须为 void，不支持 ref / out 参数。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode6" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','6');">TcpInterfaceOpenServer\SendOnly.cs</a></div>
        </p>
        <p>
            . 支持异步回调，返回值类型必须为 void，不支持 ref / out 参数，最后一个参数类型必须是委托 <b>Func&lt;AutoCSer.Net.TcpServer.ReturnValue, bool&gt;</b> 或者 <b>Func&lt;AutoCSer.Net.TcpServer.ReturnValue&lt;returnType&gt;, bool&gt;</b>
            <br />服务端必须保证该回调委托被执行，该委托的返回值表示回调数据是否成功添加到发送队列中，失败可能意味着该连接已经关闭；对于客户端而言该返回值没有意义。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode7" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','7');">TcpInterfaceOpenServer\Asynchronous.cs</a></div>
            <br />客户端与服务端采用不同的同异步模式需要<b>分别定义接口</b>，并通过配置 <b>CommandIdentityEnmuType</b> 建立映射关系，要求接口名称与枚举<b>名称一一对应</b>，参考内部服务。
        </p>
        <p>
            . 支持异步回调注册，也就是说客户端一个请求，服务器端可以任意多次回调回应，服务端被动推送是典型的应用场景。
            <br />返回值类型必须为 <b>AutoCSer.Net.TcpServer.KeepCallback</b>，对于服务端而言该返回值没有意义。
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCode8" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','8');">TcpInterfaceOpenServer\KeepCallback.cs</a></div>
        </p>
        <p>
            . 支持接口继承与显示接口实现
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCodea" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','a');">TcpInterfaceOpenServer\Inherit.cs</a></div>
        </p>
        <p>
            . 集成支持<a href="/TcpServer/RemoteExpression.html?v=50E3FBC">远程表达式链</a>
            <div> 参考示例 <a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\Example\<a id="GetCodee" href="javascript:AutoCSer.Web.Include.GetCode.Get('Example','e');">TcpInterfaceOpenServer\Expression.cs</a></div>
        </p>
        <p>
    . 简单序列化模式，采用<a href="/Serialize/Binary.html?v=50E3FBC">二进制序列化</a>模式时，输入输出参数类型如果全部属于以下类型，将默认开启简单序列化模式以提升序列化性能，否则将使用支持循环引用与成员选择的通用<a href="/Serialize/Binary.html?v=50E3FBC">二进制序列化</a>。
    <br /><b>bool</b>, <b>byte</b>, <b>sbyte</b>, <b>short</b>, <b>ushort</b>, <b>int</b>, <b>uint</b>, <b>long</b>, <b>ulong</b>, <b>float</b>, <b>double</b>, <b>decimal</b>, <b>char</b>, <b>DateTime</b>, <b>Guid</b>, <b>string</b>
    <br /><b>bool?</b>, <b>byte?</b>, <b>sbyte?</b>, <b>short?</b>, <b>ushort?</b>, <b>int?</b>, <b>uint?</b>, <b>long?</b>, <b>ulong?</b>, <b>float?</b>, <b>double?</b>, <b>decimal?</b>, <b>char?</b>, <b>DateTime?</b>, <b>Guid?</b>, <b>enum</b>
</p>
        <p>
            性能测试项目
            <br /><a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\TestCase\TcpServerPerformance\AutoCSer.TestCase.TcpOpenServerPerformance.Emit
            <br /><a href="/Index.html?v=50E3FBC" title="Go to the home page to download">AutoCSer</a>\TestCase\TcpClientPerformance\AutoCSer.TestCase.TcpOpenClientPerformance.Emit
            <br /><img @src="//f.autocser.com/TcpServer/InterfaceOpenServer.png?v=2" alt="TCP 接口服务框架 开放服务 吞吐性能测试" />
            <br /><img @src="//f.autocser.com/TcpServer/InterfaceOpenServer.Core.png" alt=".NET Core TCP 接口服务框架 开放服务 吞吐性能测试" />
            <br />从测试结果看来 .NET Core 的吞吐性能有一些提升。
        </p>
    </div>
</body>
</html>